﻿using System;
using System.Collections.Generic;
using System.Data;

namespace FinanSoft.DataLayer
{

    /// <summary>
    /// Las clases que implementan esta interface son aquellas que sirven de acceso
    /// directo con la fuente de datos de la aplicación (ya sea SQL Server, MySQL u Oracle)
    /// </summary>
    public interface IDataHelper<DataReader, Collection, DataParameter>
        // Tipo de IDataReader que devuelve un query de lectura sobre el data source
        where DataReader : IDataReader
        // Tipo de IEnumerable que necesita cualquier método que ingrese parámetros para el data source
        where Collection : IEnumerable<DataParameter>
        // Tipo IDataParameter recibido para hacer consultas/modificaciones sobre el dat source
        where DataParameter : IDataParameter
    {
        /// <summary>
        /// Abre la conexión con el data source
        /// </summary>
        /// <returns>Devuelve si la conexión se abrió exitosamente</returns>
        bool OpenConnection();

        /// <summary>
        /// Ejecuta un stored procedure de lectura sobre la conexión abierta
        /// al data source
        /// </summary>
        /// <param name="spName">Nombre del stored procedure a ejecutar</param>
        /// <param name="parameters">Colección con los parámetros de stored procedures</param>
        /// <returns>DataReader con la informción de respuesta del stored procedure</returns>
        DataReader ExecuteStoredProcedure(string spName, Collection parameters);

        /// <summary>
        /// Ejecuta un stored procedure que modifica la base de datos (no devuelve ningún tipo de
        /// resultado) sobre la conexión abierta al data source
        /// </summary>
        /// <param name="spName">Nombre del stored procedure a ejecutar</param>
        /// <param name="parameters">Colección con los parámetros del stored procedures</param>
        void ExecuteNoResultStoredProcedure(string spName, Collection parameters);

        /// <summary>
        /// Ejecuta un query de lectura sobre la conexión abierta al data source
        /// </summary>
        /// <param name="query">Query de SQL</param>
        /// <param name="parameters">Parámetros del query a ejecutar</param>
        /// <returns>DataReader con la información de respuesta del query ejecutdo</returns>
        DataReader ExecuteQuery(string query, Collection parameters);

        /// <summary>
        /// Ejecuta un query de modificación (update, insert o delete) sobre la conexión abierta al data source
        /// </summary>
        /// <param name="spName">Nombre del stored procedure a ejecutar</param>
        /// <param name="parameters">Paráetros del query a ejecutar</param>
        void ExecuteNoResultQuery(string spName, Collection parameters);

        /// <summary>
        /// Cierra la conexión al data source
        /// </summary>
        void CloseConnection();

    }
}
